package com.nine.pattern.proxy.jdk_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author nine
 * @version 1.0
 * @description 获取代理对象的工厂类
 * 代理类也实现对应的接口
 * @date 2024-07-06 21:57
 */
public class ProxyFactory {

	private TrainStation station = new TrainStation();

	public SellTicket getProxyObject() {
		// 返回代理对象
		SellTicket proxyObject = (SellTicket) Proxy.newProxyInstance(
				// 类加载器，获取代理对象的类加载器
				station.getClass().getClassLoader(),
				// 代理类实现的接口字节码对象
				station.getClass().getInterfaces(),
				// 代理对象的调用处理程序
				new InvocationHandler() {
					/**
					 *
					 * @param proxy  代理对象，和 proxyObject 是同一个对象，在 invoke 中基本不用
					 * @param method 当前要调用的方法
					 * @param args   当前要调用方法的参数
					 * @return
					 * @throws Throwable
					 */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("代理点卖票增强 .... ");
						Object result = method.invoke(station, args);
						return result;
					}
				});
		return proxyObject;
	}

}
